/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sv.com.compassion.action;

import com.opensymphony.xwork2.ActionContext;
import java.io.File;
import java.io.IOException;
import java.text.DateFormat;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.hibernate.HibernateException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import sv.com.compassion.dao.GenericoDAO;
import sv.com.compassion.entidades.Beneficiario;
import sv.com.compassion.entidades.Cdi;
import sv.com.compassion.entidades.Municipio;
import sv.com.compassion.entidades.Nivelescolaridad;
import sv.com.compassion.util.Combo;
import sv.com.compassion.util.ComunAction;
import sv.com.compassion.util.Constantes;


/** Clase para la carga de archivo XML. 
* @author grupo de Tesis
*/
public class XmlAction extends ComunAction {
    private GenericoDAO genericoDAO;
    private Cdi cdi;
    
    private String ruta;
    private String idCdi;
 
    
 /**
 *Constructor.  
 *@param GenericoDAO interface donde se encuentran los métodos para acceder a 
 * a las clases entidades necesarias. 
 */     
public XmlAction(GenericoDAO genericoDAO){
        this.genericoDAO = genericoDAO;
        cdi = new    Cdi();
        
        cdi.setIdMunicipio(new Municipio());
}   
/**
 * Busca el método que se ejecutara
 */
    @Override
    public String execute(){
        buscarMetodo(cdi);        
        return null;
    }
/**
 * Se insertan los registros del archivo XML, a la tabla Beneficiarios usando la entidad Beneficiario.
 */       
    @Override    
    public void agregarEntidad(Object o) {
        
        idCdi= getRequest().getParameter("IdCdi");
        
        List<Cdi> listaCdi = null;
        Cdi c;
        
        Map session = ActionContext.getContext().getSession();
        String idUsuario = session.get("idUsuario").toString();
        Date    date    =   new Date();
        Calendar cal = Calendar.getInstance();
        date=cal.getTime();
        
        SimpleDateFormat formatoDelTexto = new SimpleDateFormat("yyyy-MM-dd");

        int idMunicipio = 0;
        int idNivEscolaridad = 15;
        
        try{
            
            listaCdi = genericoDAO.find("SELECT c FROM Cdi c WHERE c.idCdi = '" + idCdi  + "'", null, null);
            c = listaCdi.get(0);
            idMunicipio = c.getIdMunicipio().getIdMunicipio();
            
            
        }catch(Exception e){
            
            Logger.getLogger(XmlAction.class.getName()).log(Level.SEVERE, null, e);
            enviarMensajeStatic(Constantes.MENSAJE_ERROR+e.getCause().toString(), getResponse());
            
        }
           
        
        try {
            ruta = getRequest().getParameter("Ruta");
            
            DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();

            DocumentBuilder docBuilder = null;
            
            try {
                docBuilder = docBuilderFactory.newDocumentBuilder();
            } catch (ParserConfigurationException ex) {
                Logger.getLogger(XmlAction.class.getName()).log(Level.SEVERE, null, ex);
            }
            
            Document doc = docBuilder.parse (new File(ruta));
            doc.getDocumentElement ().normalize ();
            
            NodeList listaBeneficiarios = doc.getElementsByTagName("tblXML");

            
            for (int i = 0; i < listaBeneficiarios.getLength(); i ++) {
                Node beneficiario = listaBeneficiarios.item(i);
                if (beneficiario.getNodeType() == Node.ELEMENT_NODE) {
                    Beneficiario b      = new Beneficiario();
                    Element elemento    = (Element) beneficiario;
                   // int conteoValidar   =   0;
                    String  codigoBen   =  getTagValue("Codigo", elemento);  
                    b.setCodBeneficiario(codigoBen);
                    List<Beneficiario> listaBeneficiario = null;
                    String sqlBen   =   " SELECT b from Beneficiario b where b.codBeneficiario= '" +codigoBen+ "'";
                    listaBeneficiario   = genericoDAO.find(sqlBen,null,null);
                    
                    String fechaTemp = getTagValue("FechaNacimiento", elemento);
                    
                    int indiceGuia = fechaTemp.indexOf("-");
                    String dia = fechaTemp.substring(0,indiceGuia);
                    fechaTemp = fechaTemp.substring(indiceGuia+1,fechaTemp.length());
                    
                    indiceGuia = fechaTemp.indexOf("-");
                    String mes = fechaTemp.substring(0,indiceGuia);
                    fechaTemp = fechaTemp.substring(indiceGuia+1,fechaTemp.length());
                     
                    String annio = fechaTemp;
                    
                    String fecha = annio + "-" + mes + "-" + dia;
                    
                    try {
                        b.setFecNacimiento(formatoDelTexto.parse(fecha));
                    } catch (ParseException ex) {
                        Logger.getLogger(XmlAction.class.getName()).log(Level.SEVERE, null, ex);
                    }

                    b.setSexBeneficiario(getTagValue("Genero", elemento));
                    
                    Cdi c2 = new Cdi();
                    c2.setIdCdi(Integer.valueOf(idCdi));
                    b.setIdCdi(c2);

                    Municipio m2 = new Municipio();
                    m2.setIdMunicipio(idMunicipio);
                    b.setIdMunicipio(m2);
                    
                    Nivelescolaridad n2 = new Nivelescolaridad();
                    n2.setIdNivelEscolaridad(idNivEscolaridad);
                    b.setIdNivEscolaridad(n2);
                                          
                    b.setEstBeneficiario(1);
                    if(listaBeneficiario.isEmpty()){
                        b.setAuAddUsr(Integer.valueOf(idUsuario));
                        b.setAuAddDat(date);
                        genericoDAO.save(b);
                    }else{
                        int identBen    =   listaBeneficiario.get(0).getIdBeneficiario();
                        b.setIdBeneficiario(identBen);
                        b.setAuModUsr(Integer.valueOf(idUsuario));
                        b.setAudModDat(date);
                        genericoDAO.update(b);
                    }    

                }
            }  
            List<Combo>  micombo    = new ArrayList<Combo>();
            Combo        combo      = new Combo();
            combo.setValor("");
            combo.setDescripcion("success");
            micombo.add(combo);
            JSONArray jo = JSONArray.fromObject(micombo);
            enviarJsonNavegador(getResponse(), jo);
            } catch (SAXException ex) {
                Logger.getLogger(XmlAction.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(XmlAction.class.getName()).log(Level.SEVERE, null, ex);
            }catch(HibernateException e){
                Logger.getLogger(XmlAction.class.getName()).log(Level.SEVERE, null, e);
                enviarMensajeStatic(Constantes.MENSAJE_ERROR+e.getCause().toString(), getResponse());
            
        }
        
        
        
    }
    @Override
    public void borrarEntidad(Object o) {
    }
    
    private static String getTagValue(String sTag, Element eElement){
	  NodeList nlList= eElement.getElementsByTagName(sTag).item(0).getChildNodes();
	  Node nValue = (Node) nlList.item(0);  
	  return nValue.getNodeValue();
    }
    
    @Override
    public void editarEntidad(Object o) {
    }
    @Override
    public void alimentarGrid() {
    }
    
    @Override
    public void reporteXls() {
    } 
}
